package com.zhl.gradledemo.service;

import org.apache.ibatis.session.RowBounds;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * @author austinChen
 * Created by austinChen on 2019/4/23 20:06.
 */
public interface BaseService<T>  {

    /**
     * 插入一个实体对象
     * @param t 实体对象
     * @return 插入一个实体对象
     */
    int insert(T t);

    /**
     * @param t 实体对象
     * @return 插入或者更新对象。更新只更新非null字段
     */
    int insertOrUpdate(T t);

    /**
     * @param t 实体对象
     * @param updateAll 是否更新全部字段
     * @return
     */
    int insertOrUpdate(T t, boolean updateAll);


    /**
     * @param lists 待插入列表
     * @return 返回行数
     */
    int insertList(List<T> lists);

    /**
     * 更新一个实体对象
     * @param t 实体对象
     * @return 更新一个实体对象
     */
    int update(T t);


    /**
     * @param t 实体对象
     * @param example 查询条件
     * @return 更新成功行数
     */
    int updateByExample(T t, Object example);

    /**
     * @param t 实体对象
     * @param example 查询条件
     * @return 更新成功行数
     */
    int updateByExampleSelective(T t, Object example);


    /**
     * @param t 实体对象
     * @return 根据非null字段进行更新
     */
    int updateByPrimaryKeySelective(T t);

    /**
     * 删除一个实体对象
     * @param t 实体对象
     * @return 删除一个实体对象
     */
    int delete(T t);

    /**
     * 删除一个实体对象
     * @param key 主键对象
     * @return 删除一个实体对象
     */
    int deleteByPrimaryKey(Object key);

    /**
     * 返回根据id列表进行删除的结果
     * @param ids id列表，用,分割
     * @return 根据id列表进行删除
     */
    int deleteByIds(String ids);

    /**
     * 根据查询条件进行删除
     * @param example 查询条件对象
     * @return 根据查询条件进行删除
     */
    int deleteByExample(Object example);

    /**
     * 分页查询
     * @param example 查询条件例子
     * @return 查询回来的实体列表
     */
    List<T> selectByExample(Example example);

    /**
     * 分页查询
     * @param example 查询条件例子
     * @param rowBounds 分页对象
     * @return 查询回来的实体列表
     */
    List<T> selectByExampleAndRowBounds(Example example, RowBounds rowBounds);

    /**
     * 根据样例实体对象查询出来的结果列表
     * @param t 样例实体对象
     * @return 根据样例实体对象查询出来的结果列表
     */
    List<T> select(T t);


    /**
     * 根据查询条件进行删除
     * @param  t 样例实体对象
     * @param rowBounds 分页对象
     * @return 根据查询条件进行删除
     */
    List<T>  selectByRowBounds(T t, RowBounds rowBounds);

    /**
     * ids查回来的列表
     * @param ids id列表，用,分割
     * @return ids查回来的列表
     */
    List<T> selectByIds(String ids);

    /**
     * 根据样例实体对象查询出来的结果单条值，多条报错
     * @param t  样例实体对象
     * @return 根据样例实体对象查询出来的结果单条值
     */
    T selectOne(T t);

    /**
     * 根据主键对象查询出来的单个实体对象
     * @param key 主键对象
     * @return 根据主键对象查询出来的单个实体对象
     */
    T selectByPrimaryKey(Object key);

    /**
     * 删除成功的时候后续调用其他服务用
     * @param t
     */
    void afterDeleteSuccess(T t);

    /**
     * 插入成功的时候后续调用其他服务用
     * @param t
     */
    void afterInsertSuccess(T t);

    /**
     * @param t 更新成功后调用其他服务
     */
    void afterUpdateSuccess(T t);


}
